/*
 * @Author: wuyuxin
 * @Date: 2022-01-11 15:23:05
 * @LastEditors: wuyuxin
 * @LastEditTime: 2022-01-12 15:22:54
 * @Description: 
*/
import { getAppChanges } from "../applications/app";
import { toBootstrapPromise } from "../lifecycles/bootstrap";
import { toLoadPromise } from "../lifecycles/load";
import { toMountPromise } from "../lifecycles/mount";
import { toUnmountPromise } from "../lifecycles/unmount";
import { started } from "../start";

import './navigator-events.js'
import { callCapturedEventListeners } from "./navigator-events.js";

// 核心应用处理方法
export function reroute() {

  // 需要获取要加载的应用
  // 需要获取要被挂载的应用
  // 哪些应用需要被卸载
  let pendingPromises = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
  let eventArguments = arguments.length > 1 ? arguments[1] : undefined;
  const {
    appsToLoad, // 获取要去加载的app
    appsToMount, // 获取要被挂载的
    appsToUnmount // 获取要被卸载的
  } = getAppChanges();
  // console.log(appsToLoad, appsToMount, appsToUnmount)
  // start方法调用时同步的，但是加载流程是异步的
  if (started) {
    console.log('调用started')
    // app装载
    return performAppChanges() // 根据路径来装载应用
  } else {
    console.log('调用register')
    // 注册应用时，需要预先加载
    return loadApps(); // 预加载应用
  }

  async function loadApps(params) { // 预加载应用
    console.log('预加载应用')
    await Promise.all(appsToLoad.map(toLoadPromise)); // 获取到bottstrap,mount和unmount方法放到app上
    callCapturedEventListeners(eventArguments);
  }

  async function performAppChanges(params) {
    // 先卸载不需要的应用
    appsToUnmount.map(toUnmountPromise)
    callCapturedEventListeners(eventArguments);
    // 去加载需要的应用

    // 这个应用可能需要加载 但是路径不匹配 或者出现 加载app1的时候， 这个时候切换到了app2
    appsToLoad.map(async (app) => { // 将需要要求加载的应用拿到 -》 加载 -》 启动 -》 挂载
      app = await toLoadPromise(app);
      app = await toBootstrapPromise(app);
      return await toMountPromise(app);
    })
    // 挂载已经加载的应用
    appsToMount.map(async (app) => {
      app = await toBootstrapPromise(app);
      return await toMountPromise(app);
    })
  }
}

// 以上的流程是用于初始化操作的，我们还需要 当路径切换时重新加载应用
// 重写路由相关的方法